﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Clases.Clases;
using AccesoBD;
using Clases.Estructuras;
using System.Data.Sql;
using System.Data;
using System.Data.SqlClient;
using System.Collections;

namespace Clases.ClasesPersistentes
{
    public class DaoGrupo
    {
        public void insertarGrupo(Grupo pGrupo)
        {
            string cmdText;
            Parametros tmpParametro;
            List<Parametros> parametros = new List<Parametros>();

            try
            {
                AccesoBD.DBAccess acceso = new DBAccess();
                cmdText = "INSERT INTO tgrupo (codigo_grupo,cuatrimestre,anno)" +
                                "Values (@codigoGrupo,@cuatrimestre,@anno); SELECT SCOPE_IDENTITY();";

                tmpParametro = new Parametros("codigoGrupo", pGrupo.codigoGrupo);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("cuatrimestre", pGrupo.cuatrimestre);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("anno", pGrupo.anno);
                parametros.Add(tmpParametro);

                String idGrupoTxt = acceso.ejectutarSqlConScopeIdentity(cmdText, parametros);
                int idGrupo = Int32.Parse(idGrupoTxt);
                Materia materiaMadre = pGrupo.materia;
                int idMateria = materiaMadre.idMateria;
                insertarGrupoAMateria(idMateria, idGrupo);
                insertarProfesorAGrupo(pGrupo.profesor.idUsuario, idGrupo);
            }
            catch (SqlException e)
            {
                throw e;
            }
        }




        public void insertarGrupoAMateria(int pidMateria, int pidGrupo)
        {
            List<Parametros> parametros = new List<Parametros>();

            Parametros tmp01 = new Parametros("id_curso", pidMateria);
            Parametros tmp02 = new Parametros("id_grupo", pidGrupo);
            string cmdText = "INSERT INTO tgrupo_curso (id_curso, id_grupo) VALUES (@id_curso, @id_grupo)";

            parametros.Add(tmp01);
            parametros.Add(tmp02);

            AccesoBD.DBAccess acceso = new DBAccess();

            acceso.ejecutarSQL(cmdText, parametros);
        }

        public void insertarProfesorAGrupo(int pidProfesor, int pidGrupo)
        {
            List<Parametros> parametros = new List<Parametros>();

            Parametros tmp01 = new Parametros("id_usuario", pidProfesor);
            Parametros tmp02 = new Parametros("id_grupo", pidGrupo);
            string cmdText = "INSERT INTO tprofesor_grupo (id_usuario, id_grupo) VALUES (@id_usuario, @id_grupo)";

            parametros.Add(tmp01);
            parametros.Add(tmp02);

            AccesoBD.DBAccess acceso = new DBAccess();

            acceso.ejecutarSQL(cmdText, parametros);
        }

        public List<StrGrupo> listarGrupos()
        {
            string cmdText;
            StrGrupo tmpGrupo = new StrGrupo();
            List<StrGrupo> listaGrupos = new List<StrGrupo>();

            try
            {
                cmdText = "SELECT tgrupo.id_grupo, tgrupo.codigo_grupo, tgrupo.cuatrimestre, tgrupo.anno, tcurso.nombre, tusuario.nombre_usuario AS Expr1 FROM tgrupo INNER JOIN tgrupo_curso ON tgrupo.id_grupo = tgrupo_curso.id_grupo INNER JOIN tcurso ON tgrupo_curso.id_curso = tcurso.id_curso INNER JOIN tprofesor_grupo ON tgrupo.id_grupo = tprofesor_grupo.id_grupo INNER JOIN tusuario ON tprofesor_grupo.id_usuario = tusuario.id_Usuario";
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, null);


                while (reader.Read())
                {
                    tmpGrupo.idGrupo = (int)reader.GetValue(0);
                    tmpGrupo.codigoGrupo = reader.GetValue(1).ToString();
                    tmpGrupo.cuatrimestre = (int)reader.GetValue(2);
                    tmpGrupo.anno = (int)reader.GetValue(3);
                    String nombreCurso = reader.GetValue(4).ToString();
                    String nombreProfesor = reader.GetValue(5).ToString();
                    Materia materia = Gestores.GestorMateria.buscarMateria(nombreCurso);
                    Usuario profesor = Gestores.GestorUsuario.buscar(nombreProfesor);
                    tmpGrupo.materia = materia;
                    tmpGrupo.profesor = profesor;
                    listaGrupos.Add(tmpGrupo);
                }

                reader.Close();
                return listaGrupos;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrGrupo> listarGruposDeMateria(String pnombreMateria)
        {
            string cmdText;
            StrGrupo tmpGrupo = new StrGrupo();
            List<StrGrupo> listaGrupos = new List<StrGrupo>();
            Parametros tmpParametro;
            List<Parametros> parametros = new List<Parametros>();

            try
            {
                cmdText = "SELECT tgrupo.id_grupo, tgrupo.codigo_grupo, tgrupo.cuatrimestre, tgrupo.anno, tcurso.nombre, tusuario.nombre AS Expr1 FROM tgrupo INNER JOIN tgrupo_curso ON tgrupo.id_grupo = tgrupo_curso.id_grupo INNER JOIN tcurso ON tgrupo_curso.id_curso = tcurso.id_curso INNER JOIN tprofesor_grupo ON tgrupo.id_grupo = tprofesor_grupo.id_grupo INNER JOIN tusuario ON tprofesor_grupo.id_usuario = tusuario.id_Usuario WHERE tcurso.nombre = @valor01";
                tmpParametro = new Parametros("@valor01", pnombreMateria);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);


                while (reader.Read())
                {
                    tmpGrupo.idGrupo = (int)reader.GetValue(0);
                    tmpGrupo.codigoGrupo = reader.GetValue(1).ToString();
                    tmpGrupo.cuatrimestre = (int)reader.GetValue(2);
                    tmpGrupo.anno = (int)reader.GetValue(3);
                    String nombreCurso = reader.GetValue(4).ToString();
                    String nombreProfesor = reader.GetValue(5).ToString();
                    Materia materia = Gestores.GestorMateria.buscarMateria(nombreCurso);
                    Usuario profesor = Gestores.GestorUsuario.buscar(nombreProfesor);
                    tmpGrupo.materia = materia;
                    tmpGrupo.profesor = profesor;
                    listaGrupos.Add(tmpGrupo);
                }

                reader.Close();
                return listaGrupos;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrGrupo> listarGruposDeEstudiante(String pnombreUsuario)
        {
            string cmdText;
            StrGrupo tmpGrupo = new StrGrupo();
            List<StrGrupo> listaGrupos = new List<StrGrupo>();
            Parametros tmpParametro;
            List<Parametros> parametros = new List<Parametros>();

            try
            {
                cmdText = "SELECT tgrupo.id_grupo, tgrupo.cuatrimestre, tgrupo.codigo_grupo, tgrupo.anno, tcurso.nombre FROM tgrupo INNER JOIN tgrupo_curso ON tgrupo.id_grupo = tgrupo_curso.id_grupo INNER JOIN tcurso ON tgrupo_curso.id_curso = tcurso.id_curso INNER JOIN testudiante_grupo ON tgrupo.id_grupo = testudiante_grupo.id_grupo INNER JOIN tusuario ON testudiante_grupo.id_usuario = tusuario.id_Usuario WHERE tusuario.nombre_Usuario = @valor01";
                tmpParametro = new Parametros("@valor01", pnombreUsuario);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);


                while (reader.Read())
                {
                    tmpGrupo.idGrupo = (int)reader.GetValue(0);
                    tmpGrupo.codigoGrupo = reader.GetValue(2).ToString();
                    tmpGrupo.cuatrimestre = (int)reader.GetValue(1);
                    tmpGrupo.anno = (int)reader.GetValue(3);
                    String nombreCurso = reader.GetValue(4).ToString();
                    Materia materia = Gestores.GestorMateria.buscarMateria(nombreCurso);
                    tmpGrupo.materia = materia;
                    listaGrupos.Add(tmpGrupo);
                }

                reader.Close();
                return listaGrupos;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public void modificarGrupo(Grupo pGrupo)
        {
            string cmdText;
            Parametros tmpParametro;
            List<Parametros> parametros = new List<Parametros>();
            /*
            try
            {
                AccesoBD.DBAccess acceso = new DBAccess();
                tmpParametro = new Parametros("id", pGrupo.idGrupo);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("codigo", pGrupo.codigoGrupo);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("horario", pGrupo.horario);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("fechaInicio", pGrupo.fechaInicio);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("fechaFin", pGrupo.fechaFin);
                parametros.Add(tmpParametro);

                cmdText = "UPDATE tgrupo" +
                          "SET codigo_grupo = @codigo, horario = @horario, fecha_inicio = @fechaInicio, fecha_fin = @fechaFin" +
                          "WHERE id_grupo = @id";                

                acceso.ejecutarSQL(cmdText, parametros);

            }
            catch(SqlException e)
            {
                throw e;
            }
            */
        }

        public Grupo buscarGrupo(String pCodigo)
        {
            String cmdText;
            Grupo tmpGrupo = new Grupo();
            Parametros tmpParametro;
            List<Parametros> parametros = new List<Parametros>();

            try
            {

                cmdText = "SELECT tgrupo.id_grupo, tgrupo.codigo_grupo, tgrupo.cuatrimestre, tgrupo.anno, tcurso.nombre, tusuario.nombre AS Expr1 FROM tgrupo INNER JOIN tgrupo_curso ON tgrupo.id_grupo = tgrupo_curso.id_grupo INNER JOIN tcurso ON tgrupo_curso.id_curso = tcurso.id_curso INNER JOIN tprofesor_grupo ON tgrupo.id_grupo = tprofesor_grupo.id_grupo INNER JOIN tusuario ON tprofesor_grupo.id_usuario = tusuario.id_Usuario WHERE tgrupo.codigo_grupo = @codigo";

                tmpParametro = new Parametros("@codigo", pCodigo);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);


                while (reader.Read())
                {
                    tmpGrupo.idGrupo = (int)reader.GetValue(0);
                    tmpGrupo.codigoGrupo = reader.GetValue(1).ToString();
                    tmpGrupo.cuatrimestre = (int)reader.GetValue(2);
                    tmpGrupo.anno = (int)reader.GetValue(3);
                    String nombreCurso = reader.GetValue(4).ToString();
                    String nombreProfesor = reader.GetValue(5).ToString();
                    Hashtable datosMateria = (Hashtable)Gestores.GestorMateria.buscarMateria(nombreCurso).getData();
                  
                }
                reader.Close();
                return tmpGrupo;
            }
            catch (SqlException e)
            {
                throw e;
            }
          }


        // creador por AJuarez
        // recibe un usuario(estudiante) y un grupo
        // agrega un usuario con rol de estudiante de un determinado grupo
        public void insertarEstudianteGrupo(Usuario pEstudiante, Grupo pGrupo)
        {

            // if(pEstudiante.rol=="estudiante")
            List<Parametros> parametros = new List<Parametros>();

            Parametros tmp01 = new Parametros("idUsuario", pEstudiante.idUsuario);
            Parametros tmp02 = new Parametros("idGrupo", pGrupo.idGrupo);

            string cmdText = "INSERT INTO testudiante_grupo (id_usuario, id_grupo) VALUES (@idUsuario, @idGupo)";

            parametros.Add(tmp01);
            parametros.Add(tmp02);

            AccesoBD.DBAccess acceso = new DBAccess();

            acceso.ejecutarSQL(cmdText, parametros);
        }
    

        // creador por AJuarez
        // recibe un usuario(estudiante) y un grupo
        // elimina un usuario con rol de estudiante de un determinado grupo
        public void eliminarEstudianteGrupo(Usuario pEstudiante, Grupo pGrupo)
        {
            // if(pEstudiante.rol=="estudiante")
            List<Parametros> parametros = new List<Parametros>();
            String cmdText = "DELETE FROM testudiante_grupo WHERE id_usuario = @id_usuario AND id_grupo = @id_grupo";
            Parametros tmp01 = new Parametros("id_usuario", pEstudiante.idUsuario);
            parametros.Add(tmp01);
            Parametros tmp02 = new Parametros("id_grupo", pGrupo.idGrupo);
            parametros.Add(tmp02);
            AccesoBD.DBAccess acceso = new DBAccess();
            acceso.ejecutarSQL(cmdText, parametros);
        }


        // creador por AJuarez
        // recibe un usuario(estudiante) y un grupo
        // agrega un usuario con rol de profesor de un determinado grupo
        public void insertarProfesorGrupo(Usuario pProfesor, Grupo pGrupo)
        {
            // if(pProfesor.rol=="estudiante")
            List<Parametros> parametros = new List<Parametros>();

            Parametros tmp01 = new Parametros("idUsuario", pProfesor.idUsuario);
            Parametros tmp02 = new Parametros("idGrupo", pGrupo.idGrupo);

            string cmdText = "INSERT INTO tprofesor_grupo (id_usuario, id_grupo) VALUES (@idUsuario, @idGupo)";

            parametros.Add(tmp01);
            parametros.Add(tmp02);

            AccesoBD.DBAccess acceso = new DBAccess();

            acceso.ejecutarSQL(cmdText, parametros);
        }


        // creador por AJuarez
        // recibe un usuario(profesor) y un grupo
        // elimina un usuario con rol de profesor de un determinado grupo
        public void eliminarProfesorGrupo(Usuario pProfesor, Grupo pGrupo)
        {
           // if(pProfesor.rol=="profesor")
            List<Parametros> parametros = new List<Parametros>();
            String cmdText = "DELETE FROM tprofesor_grupo WHERE id_usuario = @id_usuario AND id_grupo = @id_grupo";
            Parametros tmp01 = new Parametros("id_usuario", pProfesor.idUsuario);
            parametros.Add(tmp01);
            Parametros tmp02 = new Parametros("id_grupo", pGrupo.idGrupo);
            parametros.Add(tmp02);
            AccesoBD.DBAccess acceso = new DBAccess();
            acceso.ejecutarSQL(cmdText, parametros);
        }

    } 

       
}

